package com.shujia.day10;

import com.shujia.day10.other.Data;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.TreeSet;

public class Demo01TreeSet {
    public static void main(String[] args) {
        /*
            TODO TreeSet
                使用元素的自然顺序对元素进行排序

         */
        TreeSet<Integer> integers = new TreeSet<>();
        integers.add(2);
        integers.add(1);
        integers.add(3);
        integers.add(7);
        integers.add(5);

        System.out.println(integers);  // [1, 2, 3, 5, 7]

        /*
            TODO 对于字符串进行排序，是做了字典序排序
         */
        TreeSet<String> stringTreeSet = new TreeSet<>();
        stringTreeSet.add("1");
        stringTreeSet.add("3");
        stringTreeSet.add("10");
        stringTreeSet.add("4");
        stringTreeSet.add("5");
        System.out.println(stringTreeSet);  // [1, 2, 3, 4, 5] [1, 10, 3, 4, 5]

        // 通过comparator方法可以获取已经实现了的比较器
        //   该比较器的逻辑是由字符串提供的
        Comparator<? super String> comparator = stringTreeSet.comparator();

        System.out.println(stringTreeSet.first());
        System.out.println(stringTreeSet.last());
        // 通过给定一个左闭右开的区间 获取原先Set中的数据
        System.out.println(stringTreeSet.subSet("10", "4"));


        /*
            构造自定义类 添加到TreeSet中
         */
        TreeSet<Student> treeSet = new TreeSet<>();
        /*
            Exception in thread "main" java.lang.ClassCastException:
                    com.shujia.day10.Student cannot be cast to java.lang.Comparable
            public int compareTo(T o);
         */
        treeSet.add(new Student("001","朱非洲",18));
        treeSet.add(new Student("002","彭飞",19));
        treeSet.add(new Student("003","李杨",20));
        treeSet.add(new Student("13","李国涛",20));
        treeSet.add(new Student("012","李玉龙",20));
        treeSet.add(new Student("4","李亮",20));
        System.out.println(treeSet);

//        public TreeSet(Comparator<? super E> comparator) {
//            this(new TreeMap<>(comparator));
//        }

        /*
            TODO 适用于当添加的元素类不能进行修改实现Comparable接口
         */
        TreeSet<Data> datas = new TreeSet<>(new Comparator<Data>() {
            @Override
            public int compare(Data o1, Data o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });
        datas.add(new Data("1"));
        datas.add(new Data("11"));


    }
}


// public interface Comparable<T> {
class Student implements Comparable<Student> {
    String id;
    String name;
    int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        // 比较两个学生的顺序 依据学生ID进行升序排序
        /*
            根据需求场景，有时字典序排序方式不太合适
            TODO 当数据中存在由00开头和没有00开头，那么需要将00忽略 如何完成
                方式1：先将数据中的左边任意个0去除 再进行排序
                方式2：在排序时，忽略0
         */
        return this.getId().compareTo(o.getId());
    }
}

